package com.hspedu.newData.dmsxl.栈;

import org.junit.Test;

import java.util.*;

/**
 * @Author: yh
 * @description: 
 * @CreateTime: 2025-04-29 
 * @Version: 1.0
 */

public class LC347前k个高频元素 {

    public int[] topKFrequent(int[] nums, int k) {

        Map<Integer,Integer> map = new HashMap<>();

        // 1. hashmap 记录出现的频率
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
        }

        // 2. 创建一个小根堆
        PriorityQueue<Map.Entry<Integer,Integer>> minHeap = new PriorityQueue<>(
                new Comparator<Map.Entry<Integer, Integer>>() {
                    @Override
                    public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                        return o1.getValue() - o2.getValue();
                    }
                }
        );

        // 3. 遍历hashmap，根据value的值插入到小根堆之中
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            minHeap.offer(entry);
            // 4. 小根堆中的元素数量大于k时，推出堆顶元素
            if (minHeap.size() > k){
                minHeap.poll();
            }
        }

        // 4. 小根堆中数据转成int返回结果
        int[] res = new int[k];
        while(!minHeap.isEmpty()){
            res[--k] = minHeap.poll().getKey();
        }

        return res;
    }


    @Test
    public void test() {
        // 测试代码

        topKFrequent(new int[]{1,1,1,2,2,3},2);
    }
}
